Упражнение 2. Планирование задач и интеграция с информационной панелью
В этом упражнении вы сможете создать простой считыватель новостей RSS, который отображает последний элемент ленты новостей Plesk на информационной панели администратора. Во время написания этого расширения вы узнаете, как делать следующее:
- Писать скрипты для установки и удаления.
- Использовать хранилище пар «ключ-значение».
- Добавлять запланированные задачи.
- Создавать промо-блоки на информационной панели администратора.
Мы предполагаем, что идентификатор расширения — panel-news, и что вы начнете разработку с кода внутри папки ex2. Мы уже частично написали этот код, чтобы помочь вам сосредоточиться только на определенных областях. Кроме того, мы добавили в папку медиа-контент, необходимый для выполнения упражнения. Чтобы посмотреть завершенное упражнение, ознакомьтесь с содержимым папки ex2complete.
Шаг 1. Создание помощника для скачивания RSS-ленты
Прежде всего, давайте реализуем класс для скачивания RSS-ленты и сохранения ее последнего элемента в локальном хранилище. Для этого откройте файл /plib/library/News.php
. Обратите внимание на имя класса: оно соответствует соглашению по именованию классов, и поэтому будет загружено автоматически. В плане автозагрузки мы полагаемся на подход Zend. Читайте об этом больше здесь.
Теперь давайте реализуем метод загрузки:
public static function load()
{
$url = 'http://kb.plesk.com/rss/gen.xml?p=PLESK';
$content = @file_get_contents($url);
if (false === $content) {
return;
}
$xml = simplexml_load_string($content);
if (false === $xml || !$xml->channel) {
return;
}
$lastItem = $xml->channel->item;
pm_Settings::set('news_text', $lastItem ? (string) $lastItem->title : '');
pm_Settings::set('news_link', $lastItem ? (string) $lastItem->link : '');
}
Этот код показывает, как элемент ленты новостей помещается в хранилище пар «ключ-значение» с использованием pm_Settings::set путем присвоения переменных news_text и news_link. Теперь мы можем получить значения переменных в любое время в помощью pm_Settings::get, если контекст расширения инициализирован.
Шаг 2. Добавьте в хранилище последний элемент ленты новостей.
Расширение, которое мы собираемся написать, не будет иметь собственного графического интерфейса. Все его функции будут доступны из промо-блока на Домашней странице администратора. Поэтому у нас нет необходимости получать порядок выполнения, как мы делали в Упражнении 1 на шаге 1. Однако нам надо записать в хранилище расширения последний элемент ленты новостей. Для этого нам надо написать скрипт, который получает этот элемент и сохраняет его непосредственно после установки нашего расширения.
SDK расширений предоставляет возможность запускать скрипты PHP в этой и некоторых других ситуациях. Следующая таблица показывает, какие файлы расширения вызываются в определенных условиях.
Файл | Условие |
---|---|
/plib/scripts/pre-install.php |
Запускается перед копированием файлов расширения. Этот скрипт позволяет убедиться, что система отвечает всем требованиям расширения и не выполняет никаких изменений на сервере. На этой стадии файлы расширения недоступны. |
/plib/scripts/post-install.php |
Запускается после копирования файлов расширения. Этот скрипт выполняет все изменения, необходимые для работы расширения. Например, используя этот скрипт, вы можете создать базы данных или подготовить необходимую структуру папок. |
/plib/scripts/pre-uninstall.php |
Запускается перед удалением расширения. Этот скрипт удаляет файлы, используемые расширением, такие как базы данных, шаблоны и контент пользователей. |
Таким образом, система сканирует каждое расширение на наличие этих скриптов и запускает скрипты тогда, когда это необходимо.
В нашем упражнении мы хотим получить элемент ленты новостей после установки расширения, поэтому вам нужно изменить файл /plib/scripts/post-install.php
, добавив в него следующую строку:
Modules_PanelNews_News::load();
Это приведет к инициализации значений в хранилище пар «ключ-значение».
Шаг 3. Отобразите элемент ленты новостей в промо-блоке.
Чтобы создать промо-блок в Plesk, добавьте следующие строки в /plib/library/Promo/Home.php
:
class Modules_PanelNews_Promo_Home extends pm_Promo_Home
{
public function getTitle()
{
return 'Plesk News';
}
public function getText()
{
pm_Context::init($this->_moduleId);
return pm_Settings::get('news_text');
}
public function getButtonText()
{
return 'View Article';
}
public function getButtonUrl()
{
return pm_Settings::get('news_link');
}
public function getIconUrl()
{
pm_Context::init('plesk-news');
return pm_Context::getBaseUrl() . '/images/feed.png';
}
}
Как вы можете видеть, этот класс описывает промо-блок. Он не вызывается сам по себе где-либо в расширении. Фактически, Plesk загружает все классы, которые расширяют pm_Promo_Home автоматически, когда администратор Plesk загружает Домашнюю страницу. Для загрузки класса его имя должно соответствовать соглашению по именованию, описанному на шаге 1. Если вы упакуете расширение и добавите его в Plesk, вы увидите на информационной панели следующий новый блок. Когда администратор нажимает ссылку, он перенаправляется к переменной news_link из хранилища пар «ключ-значение».
Шаг 4. Запланируйте периодическое обновление последнего элемента ленты новостей
Переменной news_link значение присваивается всего один раз, а именно, когда расширение установлено. Нам нужно периодически обновлять ее значение в соответствии с лентой новостей Plesk. Для этого мы будем запускать запланированный скрипт. Но сначала давайте создадим этот скрипт.
Примечание: Все скрипты необходимо помещать в папку /plib/scripts
.
Предположим, имя нашего скрипта — periodic-task.php
, так что путь к нему в расширении будет /plib/scripts/periodic-task.php
. Откройте файл и добавьте в него следующий код:
Modules_PanelNews_News::load();
Выглядит знакомо? Да, мы использовали такой же код в post-install.php
. Теперь настало время запланировать запуск скрипта. Лучшее место для этого — скрипт, запускаемый после установки, так как это позволит нам убедиться, что задача успешно запланирована, сразу после установки расширения. Откройте файл /plib/scripts/post-install.php
и измените его, чтобы он выглядел следующим образом:
<?php
$task = new pm_Scheduler_Task();
$task->setSchedule(pm_Scheduler::$EVERY_DAY);
$task->setCmd('periodic-task.php');
pm_Scheduler::getInstance()->putTask($task);
Modules_PanelNews_News::load();
Этот код показывает, что для планирования запуска скрипта (так называемой задачи), нам надо создать экземпляр pm_Scheduler_Task, задать период выполнения с помощью setSchedule и указать целевой скрипт с помощью setCmd. Наконец, добавьте задачу к интерфейсу планировщика задач с помощью putTask.
При удалении расширения запланированная задача также должна быть удалена. Для этого добавьте следующую строку в файл /plib/scripts/postpre-uninstall.php
:
pm_Scheduler::getInstance()->removeAllTasks();
Этот код удалит задачу из интерфейса планировщика задач с помощью removeAllTasks.
Шаг 5. Установите и протестируйте расширение.
Поздравляем! Вы выполнили упражнение. Чтобы установить ваше расширение в Plesk:
-
Упакуйте содержимое папки ex2 (но не саму папку) в архив ZIP, используя вашу любимую программу-архиватор.
Примечание: Удостоверьтесь в том, что файл
meta.xml
находится в корне распакованного архива. Это требование очень важно, и, если оно не выполнено, при попытке добавить расширение в Plesk возникнет ошибка. -
Войдите в Plesk как администратор и добавьте расширение на странице Управление сервером > Расширения.
Ваше расширение должно появиться в списке. Оно отображается как недоступное, так как у него нет своего графического интерфейса, но вы можете видеть промо-блок на Домашней странице и проверить, что соответствующая задача запланирована, в разделе Инструменты и настройки > Планировщик задач.
Перепроверьте добавленную функциональность, чтобы убедиться, что все необходимое доступно в архиве расширения. Вы можете использовать для примера готовое расширение, доступное здесь.